package com.zenithmind.article.feign;

import com.zenithmind.article.pojo.vo.UserVO;
import com.zenithmind.common.result.Result;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 用户服务Feign客户端降级处理
 * 遵循单一职责原则：专注于服务降级逻辑
 * 遵循开闭原则：可以扩展不同的降级策略
 */
@Slf4j
@Component
public class UserFeignClientFallback implements UserFeignClient {

    @Override
    public Result<UserVO> getUserById(String id) {
        log.warn("用户服务不可用，使用降级处理获取用户信息，用户ID: {}", id);
        logFallbackEvent("getUserById", id);

        // 返回默认用户信息，避免业务中断
        UserVO defaultUser = createDefaultUser(id);
        return Result.success(defaultUser);
    }

    @Override
    public Result<java.util.List<UserVO>> getUsersByIds(String userIds) {
        log.warn("用户服务不可用，使用降级处理批量获取用户信息，用户IDs: {}", userIds);
        logFallbackEvent("getUsersByIds", userIds);

        // 返回空列表，避免业务中断
        return Result.success(java.util.Collections.emptyList());
    }

    @Override
    public Result<Boolean> userExists(String id) {
        log.warn("用户服务不可用，使用降级处理检查用户存在性，用户ID: {}", id);
        logFallbackEvent("userExists", id);

        // 默认返回true，避免业务中断
        return Result.success(true);
    }

    /**
     * 创建默认用户信息
     * 当用户服务不可用时，提供基本的用户信息以保证业务连续性
     */
    private UserVO createDefaultUser(String userId) {
        UserVO userVO = new UserVO();
        userVO.setId(userId);
        userVO.setUsername("用户服务不可用");
        userVO.setAvatar("/default-avatar.png");
        userVO.setRole("USER");
        return userVO;
    }

    /**
     * 记录服务降级事件
     * 用于监控和告警
     */
    private void logFallbackEvent(String method, String params) {
        log.error("用户服务降级触发 - 方法: {}, 参数: {}", method, params);
        // 这里可以添加监控指标上报
        // metricsService.incrementFallbackCounter("user-service", method);
    }
}
